//
// Created by madison on 2022/1/15.
//

/**
* 预处理器是一些指令，指示编译器在实际编译之前所需完成的预处理。
    所有的预处理器指令都是以井号（#）开头，只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句，所以它们不会以分号（;）结尾。
    我们已经看到，之前所有的实例中都有 #include 指令。这个宏用于把头文件包含到源文件中。
    C++ 还支持很多预处理指令，比如 #include、#define、#if、#else、#line 等，让我们一起看看这些重要指令。
*/

#include <iostream>

using namespace std;

// #define 预处理
#define PI 3.14159

// 参数宏
#define MIN(a, b) (a<b ? a : b)

// 条件编译
#define DEBUG

#define MIN(a, b) (((a)<(b)) ? a : b)

// # 和 ## 运算符
// # 和 ## 预处理运算符在 C++ 和 ANSI/ISO C 中都是可用的。# 运算符会把 replacement-text 令牌转换为用引号引起来的字符串。
#define MKSTR(x) #x

#define concat(a, b) a ## b

int main() {
    cout << "Value of PI :" << PI << endl;

    int i, j;
    i = 100;
    j = 30;
    cout << "较小的值为：" << MIN(i, j) << endl;

#ifdef DEBUG
    cerr << "Trace: Inside main function" << endl;
#endif

#if 0
    /* 这是注释部分 */
   cout << MKSTR(HELLO C++) << endl;
#endif

    cout << "The minimum is " << MIN(i, j) << endl;

#ifdef DEBUG
    cerr << "Trace: Coming out of main function" << endl;
#endif

    cout << MKSTR(HELLO C++) << endl;

    int xy = 100;

    cout << concat(x, y) << endl;

    return 0;
}